using System;
using System.Text.RegularExpressions;
using UnityEngine;

namespace Utils.Extends
{
    /// <summary>
    /// 字符串扩展方法类
    /// </summary>
    public static class StringExtends
    {
        /// <summary>
        /// 将字符串转换为整型
        /// </summary>
        /// <param name="str">要转换的字符串</param>
        /// <returns>转换后的整型值</returns>
        /// <exception cref="FormatException">当字符串不是有效的整数格式时抛出</exception>
        public static int ToInt(this string str)
        {
            return int.Parse(str);
        }

        /// <summary>
        /// 将字符串转换为浮点数
        /// </summary>
        /// <param name="str">要转换的字符串</param>
        /// <returns>转换后的浮点数值</returns>
        /// <exception cref="FormatException">当字符串不是有效的浮点数格式时抛出</exception>
        public static float ToFloat(this string str)
        {
            return float.Parse(str);
        }
        
        /// <summary>
        /// 将字符串转换为枚举类型
        /// </summary>
        /// <param name="str">要转换的字符串</param>
        /// <typeparam name="T">转换后的枚举</typeparam>
        /// <returns></returns>
        public static T ToEnum<T>(this string str) where T : Enum
        {
            return (T)Enum.Parse(typeof(T), str);
        }

        /// <summary>
        /// 将格式为"(x, y, z)"的字符串转换为Vector3
        /// </summary>
        /// <param name="str">格式应为"(x, y, z)"的字符串</param>
        /// <returns>转换后的Vector3</returns>
        /// <exception cref="FormatException">当字符串格式不正确时抛出</exception>
        public static Vector3 ToVector3(this string str)
        {
            // 使用正则表达式匹配 Vector3 格式 "(x, y, z)"
            Match match = Regex.Match(str, @"\(([\d\.-]+),\s*([\d\.-]+),\s*([\d\.-]+)\)");
            if (match.Success)
            {
                float x = float.Parse(match.Groups[1].Value);
                float y = float.Parse(match.Groups[2].Value);
                float z = float.Parse(match.Groups[3].Value);
                return new Vector3(x, y, z);
            }

            throw new FormatException("字符串格式不正确，无法解析为 Vector3...");
        }

        /// <summary>
        /// 将格式为"(x, y)"的字符串转换为Vector2
        /// </summary>
        /// <param name="str">格式应为"(x, y)"的字符串</param>
        /// <returns>转换后的Vector2</returns>
        /// <exception cref="FormatException">当字符串格式不正确时抛出</exception>
        public static Vector2 ToVector2(this string str)
        {
            // 使用正则表达式匹配 Vector2 格式 "(x, y)"
            Match match = Regex.Match(str, @"\(([\d\.-]+),\s*([\d\.-]+)\)");
            if (match.Success)
            {
                float x = float.Parse(match.Groups[1].Value);
                float y = float.Parse(match.Groups[2].Value);
                return new Vector2(x, y);
            }

            throw new FormatException("字符串格式不正确，无法解析为 Vector2...");
        }

        /// <summary>
        /// 将格式为"(r, g, b)"或"(r, g, b, a)"的字符串转换为Color，其中各分量范围为0-1
        /// </summary>
        /// <param name="str">格式应为"(r, g, b)"或"(r, g, b, a)"的字符串</param>
        /// <returns>转换后的Color</returns>
        /// <exception cref="FormatException">当字符串格式不正确时抛出</exception>
        public static Color ToColor01(this string str)
        {
            // 使用正则表达式匹配 Color 格式 "(r, g, b)" 或 "(r, g, b, a)"，其中 r, g, b, a 的范围是 0 到 1
            Match match = Regex.Match(str, @"\(([\d\.-]+),\s*([\d\.-]+),\s*([\d\.-]+)(?:,\s*([\d\.-]+))?\)");
            if (match.Success)
            {
                float r = float.Parse(match.Groups[1].Value);
                float g = float.Parse(match.Groups[2].Value);
                float b = float.Parse(match.Groups[3].Value);
                float a = match.Groups[4].Success ? float.Parse(match.Groups[4].Value) : 1.0f;
                return new Color(r, g, b, a);
            }

            throw new FormatException("字符串格式不正确，无法解析为 Color (0-1)...");
        }

        /// <summary>
        /// 将格式为"(r, g, b)"或"(r, g, b, a)"的字符串转换为Color，其中各分量范围为0-255
        /// </summary>
        /// <param name="str">格式应为"(r, g, b)"或"(r, g, b, a)"的字符串</param>
        /// <returns>转换后的Color</returns>
        /// <exception cref="FormatException">当字符串格式不正确时抛出</exception>
        public static Color ToColor255(this string str)
        {
            // 使用正则表达式匹配 Color 格式 "(r, g, b)" 或 "(r, g, b, a)"，其中 r, g, b, a 的范围是 0 到 255
            Match match = Regex.Match(str, @"\(([\d\.-]+),\s*([\d\.-]+),\s*([\d\.-]+)(?:,\s*([\d\.-]+))?\)");
            if (match.Success)
            {
                float r = float.Parse(match.Groups[1].Value) / 255f;
                float g = float.Parse(match.Groups[2].Value) / 255f;
                float b = float.Parse(match.Groups[3].Value) / 255f;
                float a = match.Groups[4].Success ? float.Parse(match.Groups[4].Value) / 255f : 1.0f;
                return new Color(r, g, b, a);
            }

            throw new FormatException("字符串格式不正确，无法解析为 Color (0-255)...");
        }
    }
}